home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
gnu
/
ispell40.lha
/
ispell-4.0
/
lexfsm.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-31
|
4KB
|
212 lines
/* Copyright (C) 1990, 1993 Free Software Foundation, Inc.
This file is part of GNU ISPELL.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdio.h>
#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#include "ispell.h"
unsigned char **lextable;
unsigned char *lexchar;
char **lexdecode;
int lexletters;
/* if out is an odd number of bytes long, must zero the
* remaining byte because hash() works 16 bits at a time.
* therefore, always write 2 zeros
*
* return the number of bytes in the compessed output.
*
* If the string contains a character that is not in the lexchar[]
* array, then the word cannot possiblally be in the dictionary.
* Therefore return 0.
*/
int
lexword (in, len, out)
char *in;
int len;
unsigned char *out;
{
unsigned char c1, c2, code;
unsigned char *startout;
startout = out;
newc1:
if (len-- == 0)
{
out[0] = 0;
out[1] = 0;
return (out - startout);
}
c1 = lexchar[*(unsigned char *) in++];
if (c1 == 0)
{
/* this character was not used anywhere in the dictionary
* return 0 to tell lookup() not to bother looking in
* the hash table
*/
return (0);
}
if (len == 0)
{
*out++ = c1;
out[0] = 0;
out[1] = 0;
return (out - startout);
}
while (len--)
{
/* c1 is a good letter */
c2 = lexchar[*(unsigned char *) in++];
code = lextable[c1][c2];
switch (code)
{
case 255: /* c2 is not a letter */
return (0);
case 0: /* both letters, but no code for this pair */
*out++ = c1;
c1 = c2;
break;
default:
*out++ = code;
goto newc1;
}
}
*out++ = c1;
out[0] = 0;
out[1] = 0;
return (out - startout);
}
void
lexprint (out, verbose)
unsigned char *out;
int verbose;
{
char *p;
char *left, *right;
if (verbose)
{
left = "<";
right = ">";
}
else
{
left = "";
right = "";
}
while (*out)
{
p = lexdecode[*out];
if (*p == 0)
(void) printf ("{illegal code %d}", *out);
else if (p[1] == 0)
putchar (p[0]);
else
printf ("%s%s%s", left, p, right);
out++;
}
}
int
lexsize (NOARGS)
{
return (256 * 2 + 256 + lexletters * lexletters);
}
void
lexdump (f)
FILE *f;
{
int i, j;
for (i = 0; i < 256; i++)
{
(void) putc (lexdecode[i][0], f);
(void) putc (lexdecode[i][1], f);
}
for (i = 0; i < 256; i++)
(void) putc ((int) lexchar[i], f);
for (i = 0; i < lexletters; i++)
for (j = 0; j < lexletters; j++)
(void) putc ((int) lextable[i][j], f);
}
void
lexalloc (NOARGS)
{
int i;
char *p;
lexdecode = (char **) xmalloc (256 * sizeof (char *));
p = (char *) xcalloc (256, 3);
for (i = 0; i < 256; i++)
{
lexdecode[i] = p;
p += 3;
}
lexchar = (unsigned char *) xcalloc (256, 1);
lextable = (unsigned char **) xmalloc (lexletters * sizeof (char *));
for (i = 0; i < lexletters; i++)
lextable[i] = (unsigned char *) xcalloc ((unsigned) lexletters, 1);
}
void
lexload (f, nlet)
FILE *f;
unsigned long nlet;
{
int i, j;
unsigned char *up;
char *p;
lexletters = (int) nlet;
lexalloc ();
for (i = 0; i < 256; i++)
{
p = lexdecode[i];
*p++ = getc (f);
*p++ = getc (f);
*p = 0;
}
for (i = 0, up = lexchar; i < 256; i++, up++)
*up = getc (f);
for (i = 0; i < lexletters; i++)
{
for (j = 0; j < lexletters; j++)
lextable[i][j] = getc (f);
}
}